iT邦幫忙

2

C# Timer(3種)

  • 分享至 

  • xImage
  •  

用到的地方
1.每秒更新時間
2.每15分提醒眼睛需要休息
3.提醒:下班時間到了
4.更新UI上的時鐘

同一執行緒 VS.不同執行緒
System.Windows.Forms.Timer 存取UI元件 (同一執行緒)
System.Timers.Timer
-存取UI元件 用SynchronizingObject屬性 (設為同一執行緒)
-存取UI元件 訪問 (不同執行緒)
System.Threading.Timer(透由委派來存取UI元件)

時間單位為毫秒(ms) 1000是一秒

System.Windows.Forms.Timer

只要把工具箱中的Timer控制項拖到表單上,然後設置事件和間隔時間等屬性就可以了

Start 方法啟用定時器,開始觸發 Elapsed
Stop 方法停止定時器,停止觸發 Elapsed

拉timer
https://ithelp.ithome.com.tw/upload/images/20180102/20106764CbJxYOozCa.png

在load時啟動timer

        private void Timer1_Load(object sender, EventArgs e)
        {
            timer2.Start();
        }

撰寫tick 事件
https://ithelp.ithome.com.tw/upload/images/20180102/20106764WH4xISnkMV.png

        private void timer2_Tick(object sender, EventArgs e)
        { 
          //在這裡做想做的事  label1.Text = (int.Parse(label1.Text) + 1).ToString();
        }

System.Timers.Timer

Start 方法啟用定時器,開始觸發 Elapsed
Stop 方法停止定時器,停止觸發 Elapsed

private System.Timers.Timer _TimersTimer;

        private void Timer2_Load(object sender, EventArgs e)
        {
            this._TimersTimer = new System.Timers.Timer();
            this._TimersTimer.Interval = 100;
            this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed); 
            this._TimersTimer.Start();
        }
                
        void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {  
           //在這裡做想做的事           
        }

存取UI
出現錯誤訊息 : 跨執行緒作業無效: 存取控制項 'label1' 時所使用的執行緒與建立控制項的執行緒不同。
解決方法

SynchronizingObject

拉一個label做顯示

private System.Timers.Timer _TimersTimer;

        private void Timer2_Load(object sender, EventArgs e)
        {
            this._TimersTimer = new System.Timers.Timer();
            this._TimersTimer.Interval = 100;
            this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed);
            this._TimersTimer.SynchronizingObject = this;
            this._TimersTimer.Start();
        }
                
        void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {  
           //在這裡做想做的事 label1.Text = (int.Parse(label1.Text) + 1).ToString();
        }

委派

        private System.Timers.Timer _TimersTimer;

        private void Timer22_f_Load(object sender, EventArgs e)
        {
            this._TimersTimer = new System.Timers.Timer();
            this._TimersTimer.Interval = 100;
            this._TimersTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TimersTimer_Elapsed); 
            this._TimersTimer.Start();
        } 
        
        private void Timer22_f_FormClosed(object sender, FormClosedEventArgs e)
        {
            _TimersTimer.Stop();//如果不停的話,timer會繼續跑而且找不到label就會出錯            
        }
 
        delegate void UpdateControl1( string Msg);
        private object _objLock1 = new object();
        void _mUpdateControl(  string Msg)
        {
            lock (this._objLock1)
            {
                label1.Text = Msg;
            }
        }
 
        void _TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
        {
            int iVal = (int.Parse(label1.Text) + 1);  
            this.BeginInvoke(
                new UpdateControl1(_mUpdateControl)//fuction
                , new object[] { iVal }//param
                );
        }

System.Threading.Timer

不斷更新時間
不斷更新時間的同時,也能在textbox輸入
https://ithelp.ithome.com.tw/upload/images/20180104/20106764PECKD7Hx7O.png

        using System.Threading;
        private void button9_Click(object sender, EventArgs e)
        {
            //宣告timer要做什麼事.要做什麼事呢?要做_do的事
            TimerCallback callback = new TimerCallback(_do);
            //1.function 2.開關  3.等多久再開始  4.隔多久反覆執行
            System.Threading.Timer timer = new System.Threading.Timer(callback,null,0,1000);
        }

        private void _do(object state)
        {
             int count=0;
             while(count<100)
             {
               Console.WriteLine(count);
             }
        }

存取UI

        private void button9_Click(object sender, EventArgs e)
        {
            //宣告timer要做什麼事.要做什麼事呢?要做_do的事
            TimerCallback callback = new TimerCallback(_do);
            //1.function 2.開關  3.等多久再開始  4.隔多久反覆執行
            System.Threading.Timer timer = new System.Threading.Timer(callback,null,0,1000);
        }

        private void _do(object state)
        {
            this.BeginInvoke(new setLable2(setLabel2));
            //label2.Text = DateTime.Now.ToString();
            //Console.WriteLine(DateTime.Now.ToString());
        }
        delegate void setLable2();
        private void setLabel2()
        {
            label2.Text = DateTime.Now.ToString();
        }

Q
它有點像接力賽,跑一跑,交棒換別人,然後再等著棒子回來再繼續做.
AutoResetEvent AutoResetEvent = new AutoResetEvent(false);//它是開關,開始/停(換人)/結束
?autoEvent.Set();//交棒出去//?沒有交棒出去,UI上也能輸入.所以交棒的用意在哪裡呢?
AutoResetEvent.WaitOne();


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言